/*
 * @Author: 大D
 * @email: 857216393@qq.com
 * @Date: 2024-01-28 20:25:12
 * @Description:生成环境配置 进行打包优化相关
 */
import { defineConfig } from 'vite';
// 打包体积分析
import { visualizer } from 'rollup-plugin-visualizer';
// gzip压缩
import viteCompression from 'vite-plugin-compression';
// 图片压缩
import viteImagemin from 'vite-plugin-imagemin';
// cdn
// import { createHtmlPlugin } from 'vite-plugin-html';
// import externalGlobals from 'rollup-plugin-external-globals';

export default defineConfig({
  plugins: [
    // 打包体积分析
    visualizer({ open: true }),
    // 开启gzip静态资源压缩
    viteCompression({
      verbose: true, // 是否在控制台中输出压缩结果
      disable: false,
      threshold: 1024, // 如果体积大于阈值，将被压缩，单位为b，体积过小时请不要压缩，以免适得其反
      algorithm: 'gzip', // 压缩算法，可选['gzip'，' brotliccompress '，'deflate '，'deflateRaw']
      ext: '.gz',
      deleteOriginFile: false // 源文件压缩后是否删除(我为了看压缩后的效果，先选择了true)
    }),
    // 图片压缩
    viteImagemin({
      gifsicle: {
        // gif图片压缩
        optimizationLevel: 3, // 选择1到3之间的优化级别
        interlaced: false // 隔行扫描gif进行渐进式渲染
        // colors: 2 // 将每个输出GIF中不同颜色的数量减少到num或更少。数字必须介于2和256之间。
      },
      optipng: {
        // png
        optimizationLevel: 7 // 选择0到7之间的优化级别
      },
      mozjpeg: {
        // jpeg
        quality: 20 // 压缩质量，范围从0(最差)到100(最佳)。
      },
      pngquant: {
        // png
        quality: [0.8, 0.9], // Min和max是介于0(最差)到1(最佳)之间的数字，类似于JPEG。达到或超过最高质量所需的最少量的颜色。如果转换导致质量低于最低质量，图像将不会被保存。
        speed: 4 // 压缩速度，1(强力)到11(最快)
      },
      svgo: {
        // svg压缩
        plugins: [
          {
            name: 'removeViewBox'
          },
          {
            name: 'removeEmptyAttrs',
            active: false
          }
        ]
      }
    })
    // cdn
    // createHtmlPlugin({
    //   minify: true,
    //   inject: {
    //     data: {
    // vueScript:
    //   '<script src="https://cdn.jsdelivr.net/npm/vue@3.3.11/dist/vue.global.min.js"></script>',
    // vuedemiScript:
    //   '<script src="https://cdnjs.cloudflare.com/ajax/libs/vue-demi/0.14.6/index.iife.js"></script>'
    // piniaScript:
    //   '<script src="https://cdn.jsdelivr.net/npm/pinia@2.1.7/dist/pinia.iife.min.js"></script>',
    // axiosScript:
    //   '<script src="https://cdn.jsdelivr.net/npm/axios@1.6.7/dist/axios.min.js"></script>'
    //     }
    //   }
    // }),
  ],
  build: {
    minify: 'terser',
    terserOptions: {
      compress: {
        //生产环境时移除console
        drop_console: true,
        drop_debugger: true
      },
      output: {
        // 去掉注释内容
        comments: true
      }
    },
    //   关闭文件计算
    reportCompressedSize: false,
    //   关闭生成map文件 可以达到缩小打包体积
    sourcemap: false, // 这个生产环境一定要关闭，不然打包的产物会很大
    chunkSizeWarningLimit: 1500,
    rollupOptions: {
      // 告诉打包工具 在external配置的 都是外部依赖项  不需要打包
      // external: ['vue'],
      // plugins: [
      // externalGlobals({
      // "在项目中引入的变量名称"："CDN包导出的名称，一般在CDN包中都是可见的"
      // vue: 'Vue'
      // 'vue-demi': 'VueDemi'
      // })
      // ],
      output: {
        // 配置打包文件名
        chunkFileNames: `static/chunk/[name]-[hash].js`,
        entryFileNames: `static/entry/[name]-[hash].js`,
        assetFileNames: `static/[ext]/[name]-[hash].[ext]`,
        manualChunks(id) {
          // 最小化拆分包
          if (id.includes('node_modules')) {
            return id.toString().split('node_modules/')[1].split('/')[0].toString();
          }
        }
      }
    }
  }
});
